TP Noté 1 : Dans la peau d'un influenceur data-scientist¶

Ecole
Option InfoIA
PAPY: Programmation avancée python
TP3.2
Année 2022-2023
Auteur: Lucas Lestandi
lucas.lestandi@ec-nantes.fr
V1.0

Rendu de:¶

Daniel MACEDO GALEMBECK

Nicolas CONTRERAS PÉREZ

Nantes, 11/10/2022

Attention : il s'agit d'un TP noté. Le notebook de rapport, ainsi que les fichiers/modules `.py` seront à déposer sur Hippocampus avant la séance suivante. Autrement dit, mercredi 23:59.
Bien entendu, vous pouvez travailler en groupe, mais pas plus de 3. Merci de m'informer pendant la séance des groupes, via slack par exemple.

Dans ce TP, vous mettrez en oeuvre les connaissances acquises au cours de précédentes séances. Vous utiliserez à bon escient les paradigmes de programmation d'un vrai projet : des fonctions, des classes, et une structure de code utilisant des modules externes.

Récemment, l'actualité a été marquée par de nombreux articles relatant le mécontentement certains milliardaires face aux comptes twitter (et autre) relatant leurs déplacements en jet privé. On notera le cas I fly Bernard, l'avion de Bernard coté français et ElonJet outre atlantique avec par Jack Sweeney. Les codes respectifs sont plus ou moins disponibles en ligne et plus ou moins faciles à suivre. Dans tous les cas, ils s'appuient sur des données publiques puisque tous les avions doivent être équipés d'un émetteur ADSB donnant leur position. Ces données sont extraites des bases et traitées avec le langage le plus simple pour ces taches : python, évidemment.

Le but de ce TP est de reproduire, dans un notebook, la capture des données ADSB, puis leur traitement pour afficher un trajet (avec matplotlib) et effectuer quelques traitements, par exemple pour une flotte complète. On proposera notre propre structure (de classe) simplifiée mais modulaire. On commencera par une rapide analyse du code source de deux comptes automatisés cité au-dessus afin de déterminer comment en tirer profit pour accélérer notre développement.

Analyse de code [1h-2h]¶

Les codes "L'avion de Bernard" et "ElonJet" sont très différent. Pour les deux codes, on proposera une analyse rapide en répondant aux questions suivantes.

  1. Récupération des sources avec git

  2. Description de la structure du projet,

    • nombre de fichiers python, autres langages, documents
    • documentation et la facilité d'installation
    • Licence : A-t-on le droit d'utiliser ce code pour usage personnel? commercial?
  3. Peut on exécuter le script principal et/ou un exemple?

  4. Que fait le code ?

    • décrire la trame en quelques points clés
    • quelles sont les dépendances principales
    • Si la structure est complexe, on pourra utiliser la commande suivante pour dessiner un diagramme de classe et le commenter.
    $ pyreverse -o svg NOM-PAQUET .
    

    pyverse fait parti du paquet pylint.

    • commenter la qualité de l'implementation : respet des PEP, facilité de lecture, commentaires
  5. Evaluation de l'utilité:

    • ce code est-il pret à l'usage?
    • ce code peut-il etre facilement utilisé?
    • ce code est-il modulaire?
    • dans le contexte de ce "projet" peut-on utiliser ce code comme squelette?

Question concluion: On comparera ces deux paquets dans un court paragraphe avant de conclure sur leur utilisation dans la partie suivante.


Analyse de L'avion de Bernard¶

  1. Récupération des sources avec git
On a récupéré le code de GitHub en utilisant la commande suivante :

git clone https://github.com/laviondebernard/instagram.git

  1. Description de la structure du projet,
  • nombre de fichiers python, autres langages, documents
Le projet contient deux fichiers CSV, un fichier Python, un fichier Text, un fichier Markdown, deux fichiers PNG, un fichier .log vide et enfin un fichier appelé img_created_here sans type spécifié et vide.
  • documentation et la facilité d'installation
D'après ce que l'on peut voir, ce projet est principalement utilisé pour poster des images sur Instagram, il n'y a donc pas de méthode très détaillée pour son installation.

La documentation consiste en un fichier README.md qui détaille brièvement son but, son fonctionnement et des conseils ou de l'aide sur la façon de l'utiliser de manière très vague.

Le créateur n'offre aucune assistance pour l'installation ou l'utilisation. Il n'y a qu'une seule issue fermée, qui a été répondue par un non-membre du projet, et une issue ouverte écrite le 26 juillet 2022, qui n'a pas encore été répondue. Nous supposons donc que son objectif en mettant le code en ligne est simplement de le partager.

  • Licence : A-t-on le droit d'utiliser ce code pour usage personnel? commercial?
Oui, le projet est sous licence MIT et mentionne que le code peut être utilisé à des fins personnelles et/ou commerciales. Celui qui l'utilise doit ajouter la licence et l'autorisation détaillées dans le fichier LICENSE.text.
  1. Peut on exécuter le script principal et/ou un exemple?
Oui, mais il faut avoir les librairies python suivantes : os, sys, re, random, requests, time, datetime, locale, csv, folium, PIL, selenium, geopy, smtplib et ssl.

De plus, selon la section d'aide écrite dans le fichier README.md, les paramètres suivants doivent être modifiés pour fonctionner correctement :

  • ligne 22 : chemin absolu vers le fichier bernard.py
  • ligne 39,40,41 : infos sur l'avion (y compris émissions de CO2 par km)
  • ligne 46 : chemin absolu vers le geckodriver
  • ligne 50 : chemin absolu vers votre profil firefox (pour garder les sessions instagram ouvertes avec des cookies)
  • ligne 56,57 : identifiants instagram
  • ligne 78,79,80,81 : identifiants mail (pour recevoir confirmation du déroulé du script par mail)
  • ligne 107 : URL de votre .json de test (optionnel)
  • ligne 314 : changer les dimensions pour adapter la taille de l'image de sortie
  1. Que fait le code ?
  • décrire la trame en quelques points clés
Le script obtient les informations de vol à partir de l'API OpenSkyNetwork, selon le numéro icao24 correspondant. Il crée une image par vol, en utilisant la librairie folium, et publie l'image sur Instagram. Pour cela, il faut avoir Firefox, geckodriver et ajouter au code quelques données et identifiants de notre compte Instagram. C'est important de mettre la compte Instagram en français.

Sur Instagram, le code ajoute également des hashtags aléatoires et calcule les émissions de CO2. L'utilisateur doit enregistrer manuellement les tonnes de CO2 par kilomètre de l'avion correspondant dans une variable appelée tonPerKm, à la ligne 41.

Enfin, le code envoie toutes les informations par courrier électronique. L'utilisateur doit enregistrer manuellement les variables dans le fichier bernard.py, dans les variables smtp, port, email et password.

  • quelles sont les dépendances principales
L'une des principales dépendances du projet est folium. Cette librairie permet de manipuler des données en Python, puis de les visualiser dans une carte Leaflet.

Comme le projet publie des images sur Instagram, la bibliothèque selenium est un autre élément important. Ce paquet est utilisé pour automatiser l'interaction avec le navigateur web à partir de Python.

  • Si la structure est complexe, on pourra utiliser la commande suivante pour dessiner un diagramme de classe et le commenter.
$ pyreverse -o svg NOM-PAQUET .

pyverse fait parti du paquet pylint.

Folium et Selenium ont tous deux des structures très complexes, donc dans les fichiers folium_classes.svg, folium_packages.svg, selenium__packages.svg et selenium_classes.svg, nous pouvons voir leurs diagrammes de classe respectifs.

Le projet utilise les classes folium.Map, folium.Marker, folium.divIcon, folium.CircleMarker et folium.PolyLine. Le projet utilise les classes folium.Map, folium.Marker, folium.divIcon, folium.CircleMarker et folium.PolyLine. En regardant les diagrammes de classes, il est possible de voir que folium.Map est l'une des classes ayant le plus d'attributs et que de nombreuses autres classes de la bibliothèque dépendent d'elle.

D'autre part, la classe la plus utilisée de la bibliothèque selenium dans le projet est webdriver. En regardant les diagrammes de classes, on constate que c'est la classe qui a le plus grand nombre d'attributs et de méthodes, ce qui est cohérent avec le fait qu'elle est la plus mentionnée dans le code.

  • commenter la qualité de l'implementation : respet des PEP, facilité de lecture, commentaires
Tout d'abord, je ne pense pas que ce soit très sécurisé de mettre les identifiants des comptes Instagram et notre email directement dans le code. On peut utiliser une librairie comme dotenv ou simplement ajouter les identifiants dans un autre fichier python.

En ce qui concerne les normes PEP8, les éléments suivants ne sont pas respectés :

  • E261 au moins deux espaces avant le commentaire en ligne
  • il y a des parenthèses redondantes
  • E501 ligne trop longue ( > 120 caractères)
  • E701 plusieurs déclarations sur une ligne
  • E231 espace blanc manquant après ','.
  • E722 ne pas utiliser le mot "except" (sauf)
  • E225 espaces manquants autour de l'opérateur
  • Point-virgule de fin dans la déclaration
  • E101 l'indentation contient un mélange d'espaces et de tabulations
  • E122 La ligne de continuation n'a pas d'indentation ou est en dehors de l'indentation.
  1. Evaluation de l'utilité:
  • ce code est-il pret à l'usage?
Non, il faut installer plusieurs dépendances et ajouter des informations d'identification pour pouvoir l'utiliser.
  • ce code peut-il etre facilement utilisé?
Non. Bien que le code soit commenté, il existe des lignes de code complexes qui ne sont pas expliquées. Pour le comprendre pleinement, il faut tester chaque partie séparément et avec différents types de tests.
  • ce code est-il modulaire?
Non. Il y a un seul fichier de code (bernard.py) qui contient toute la logique du projet. Le code ne comporte pas non plus de fonctions ou de classes.
  • dans le contexte de ce "projet" peut-on utiliser ce code comme squelette?
Oui, on pourrait utiliser une partie de ce code pour créer la section Données historiques de ce TP. En particulier, pour tracer le vol d'un avion.

Analyse de ElonJet¶

  1. Récupération des sources avec git
On a récupéré le code de GitHub en utilisant la commande suivante :

git clone https://github.com/Jxck-S/plane-notify

  1. Description de la structure du projet,
  • nombre de fichiers python, autres langages, documents
99% de les fichiers du projet sont fichiers .py, mais il y a quelques autres utilies pour la implementation du projet : un Readme.md avec instrutions d'utilisation et un fichier texte avec tous les dependances de modules. Le projet est bien modularisé en fichiers différents, avec noms très descritifs, specialement pour les fichiers .py.
  • documentation et la facilité d'installation
Le projet, contrairement au l'avion de Bernard, est devenu un outil pour que quelqu'un puisse l'utiliser et être notifié le décollage et l'atterrissage d'un avion en perticulier, ça veut dire, il est pas conceptualizé à fin qu'on puisse traquer que l'avion de Elon Musk, mais un avion de notre choix. Donc, la installation et utilisation du projet est bien documenté, avec un Readme.md bien complet. En plus, il y a un lien vers une page de bibliographie, avec plusieurs documentations de les modules, l'API et outils utilisés.

En plus, l'auteur se dit ouvert à nouveux contributeurs et sugestions, en donnant un lien Discord pour discuter améliorations. Comme conséquence, il y a déjà eu 383 forks, 30 pull resquests qu'on été fermées ( et 18 encore ouvertes ) et 19 utilisateurs du GitHub sont considerés comme contribuers. Effectivemente, c'est un projet open source.

  • Licence : A-t-on le droit d'utiliser ce code pour usage personnel? commercial?
Oui, le projet est sous licence GNU General Public License (GNU - GPL v3.0) et mentionne que le code peut être utilisé à des fins personnelles et/ou commerciales. En plus, on peut encore le copier et distribuer sans avoir faite quelque modifitaion. Celui qui l'utilise doit ajouter la licence et l'autorisation détaillées dans le fichier LICENSE.text.
  1. Peut on exécuter le script principal et/ou un exemple?
Oui, mais il faut avoir les librairies python suivantes : os, sys, signal, pytz, tracceback, time, datetime, platform, colorama, logging... et tous est listé en Pipfile.

De plus, selon la section d'aide écrite dans le fichier README.md, il y a quelques actions à prendre avant :

  • Configurer mainconf.ini et plane1.ini. Ces fichiers ont le configurations d'où les informations vont être prises ( OpenSky ou ADS-B ), où les notifications vont être lancés ( Twitter ou Discord ), quel avion on souhait suivre etc. Pour chaque .ini il y a des fichiers examples si vous ne voulez pas faire le propre.
  • L'auteur laisse bien explicite que le projet est plus optimisé pour ADS-B Exchange ( service payé pour obtention de donnés de l'aviation ) par rapport au OpenSky.
  1. Que fait le code ?
  • décrire la trame en quelques points clés
Le fonctionement n'est pas très différent de celui de l'avion de Bernard - le script obtient les informations de vol à partir de l'API OpenSkyNetwork ou d'après la plataforme ADS-B, selon le numéro icao24 correspondant. Il crée une image par vol, en utilisant la librairie folium, et envoye l'image au Twitter ou en Discord, d'après les configurations données en les fichiers .init mentionnés avant.
  • quelles sont les dépendances principales
L'une des principales dépendances du projet est folium. Cette librairie permet de manipuler des données en Python, puis de les visualiser dans une carte Leaflet.
  • Si la structure est complexe, on pourra utiliser la commande suivante pour dessiner un diagramme de classe et le commenter.
$ pyreverse -o svg NOM-PAQUET .

pyverse fait parti du paquet pylint.

On a fait pour la classe avion, le résultat (fichiers .svg sont annexés)

  • commenter la qualité de l'implementation : respet des PEP, facilité de lecture, commentaires
Tout d'abord, je ne pense pas que ce soit très sécurisé de mettre les identifiants des comptes Twitter/Discord et notre email directement dans le code. On peut utiliser une librairie comme dotenv ou simplement ajouter les identifiants dans un autre fichier python.

En ce qui concerne les normes PEP8, les éléments suivants ne sont pas respectés :

  • E261 au moins deux espaces avant le commentaire en ligne
  • il y a des parenthèses redondantes
  • E501 ligne trop longue ( > 120 caractères)
  • E701 plusieurs déclarations sur une ligne
  • E231 espace blanc manquant après ','.
  • E722 ne pas utiliser le mot "except" (sauf)
  • E225 espaces manquants autour de l'opérateur
  • Point-virgule de fin dans la déclaration
  • E101 l'indentation contient un mélange d'espaces et de tabulations
  • E122 La ligne de continuation n'a pas d'indentation ou est en dehors de l'indentation.

Donc, c'est évident que le projet n'est pas fait en prenant compte le PEP8.

  1. Evaluation de l'utilité:
  • ce code est-il pret à l'usage?
Non, il faut installer plusieurs dépendances et ajouter des informations d'identification pour pouvoir l'utiliser. De toute façon, pour l'utiliser avec les configurations de base ce n'est pas si difficile.
  • ce code peut-il etre facilement utilisé?
Non. Bien que le code soit commenté, il existe des lignes de code complexes qui ne sont pas expliquées. Pour le comprendre pleinement, il faut tester chaque partie séparément et avec différents types de tests. En plus, je dirait qu'il plusieurs modules avec fonctions vraiment spécifiques et pas évidents si on ne regarde pas la documentation.
  • ce code est-il modulaire?
Oui, il est bien divisé en différents fichiers .py, surtout pour faire la configuration.
  • dans le contexte de ce "projet" peut-on utiliser ce code comme squelette?
Oui, bien sûr. En effet, comme dit précédemment, le projet est écrit pour qu'on puisse le customizer d'après nos besoins.

Une visu maison.¶

Comme vous le voyez, tout n'est pas bon à prendre dans un code trouvé en ligne. Cela peut être dû à plusieurs facteurs: inadéquation avec le projet en cours, trop grande complexité, mauvaise organisation, difficulté d'installation, etc.

Nous allons réduire la complexité au minimum afin d'obtenir des résultats exploitables en quelques heures.

Pour cela, on utilisera tout de même certains paquets généralistes que l'on maitrise déjà (en théorie) et quelques autres spécifiques au problème, en particulier sous forme d'API.

Pré-requis:

  • bibliothèques à installer : pandas, numpy, matplolib, cartopy/cartes

mamba install -c conda-forge cartopy

Objectifs:

  • Installer openskyAPI et récupérer les données ADSB publiques grâce à l'API d'openskynetworks
  • Créer une structure de classe permettant de représenter : des avions et des trajets. En option, pourrait aimer représenter les aéroports.
  • Proposer une visualisation avec matplotlib-cartopy d'un trajet
  • Extraire un certain nombre d'informations issues des données de vol

Les données: Le système ADS-B est publique mais la conservation des données nécessites des moyens, ne serait-ce que pour le stockage et l'accés web. Pour cette raison les services proposent plusieurs version selon le degrès d'implication des utilisateurs (authentifié ou non, payant ou non).

  • openskynetworks est une association à but non lucratif qui récolte les signauax ADS-B (entre autre) et les rends accessible gratuitement et sur enregistrement. Il semblerait que l'API python ne permette d'accéder qu'aux données en temps réel. D'autres modes d'accés son possible (requettes web, etc.), en particulier à l'aide d'un compte. Pour ce TP, nous ferons sans. Les données retenues:
    • l'api opensky_api pour récupérer des données en direct et tracer une carte "radar" autour de sa position
    • des données historiques téléchargées à l'avance sur ce même site au format CSV pour la semaine du 27 Juin 2022.

Exploration des données¶

Installation openskyAPI

  • cloner les sources
  • Suivre le readme.md et installer avec pip
  • Explorer un peu les données :
    1. Combien d'avions volent en ce moment dans le monde?
    2. Combien sont aux sol mais avec le transpondeur allumé?
    3. Quelle est la vitesse moyenne des appareils dans le "carré" (42,51,-5,8)?
    4. Proposer une ou deux autres métriques intéressantes.
    5. Recharger les données, les résultats sont-ils les mêmes?
In [3]:
from opensky_api import OpenSkyApi
import time

Vérification de l'environnement de programmation¶

In [4]:
!which python3
!python3 -V
!ls
/opt/homebrew/bin/python3
Python 3.10.6
Fichiers Scalable Vector Graphics states
TP3.2-eleve.ipynb                 states_carre
carte.jpg                         trajectoire.jpg
src
In [5]:
# Les informations d'identification d'OpenSky Network sont chargées à partir du fichier .env.
from dotenv import load_dotenv
import os

env_path = os.path.join('.env')
load_dotenv(env_path)
USERNAME = os.getenv('USERNAME')
PASSWORD = os.getenv('PASSWORD')

Connexion API¶

In [6]:
#api = OpenSkyApi()
#On a crée un compte pour avoir plusieurs plus de requêtes 
api = OpenSkyApi(USERNAME, PASSWORD)

Q1 : Combien d'avions volent en ce moment dans le monde?¶

In [7]:
states = api.get_states()
In [8]:
#Confirmation de l'overture de la classe de l'API
type(states) 
Out[8]:
opensky_api.OpenSkyStates
In [9]:
#Réponse: la quantité d'états où l'attribut 'on_ground' est False 
#(ça veut dire, l'avion du état correpondant est au air)
listt = [k for k in states.states if k.on_ground == False]
print(f"Combien d'avions volent en ce moment dans le monde? : \n {len(listt)} des avions")
Combien d'avions volent en ce moment dans le monde? : 
 6661 des avions

Q2 : Combien sont aux sol mais avec le transpondeur allumé?¶

In [10]:
#Ici on vérifie tous les vols avec les attributs on_ground and squack == True : sont en sol et avec le transponder allumé
quantite = 0

for s in states.states:
    if s.on_ground and s.squawk:
        quantite += 1 

print(f"Combien sont aux sol mais avec le transpondeur allumé? : \n {quantite} des avions")
Combien sont aux sol mais avec le transpondeur allumé? : 
 121 des avions

Q3 : Quelle est la vitesse moyenne des appareils dans le "carré" (42,51,-5,8)?¶

In [14]:
#On prend les données en le carré
states_carre = api.get_states(bbox=(42,51,-5,8)) # on récupére tous les vols en ce moment sur un zone couvrant l'essentiel de la France.
In [15]:
type(states_carre)
Out[15]:
opensky_api.OpenSkyStates
In [16]:
#On passe pour chaque vol et on fait la moyenne
vitesse_somme = 0
nombre = 0
for s in states_carre.states:
    if s.velocity:
        vitesse_somme += s.velocity
        nombre += 1
        
print(f"Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : \n {vitesse_somme / nombre} m/s")
Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : 
 174.53462264150934 m/s

Q4 : Proposer une ou deux autres métriques intéressantes¶

L'attribut origin_country est important car il est possible d'obtenir des données sur le nombre d'avions au départ de chaque pays.

D'autre part, true_track est également intéressant car il indique dans quelle direction et quel sens l'avion se dirige.

In [17]:
# Affichage des dix premières données avec le pays d'origine le Brésil aveec le true_track

listt = [(k.origin_country, k.true_track) for k in states.states if k.origin_country == 'Brazil']

for i in range(10):
    print(f"Origin country : {listt[i][0]}; true_track : {listt[i][1]}")
Origin country : Brazil; true_track : 221.6
Origin country : Brazil; true_track : 216.36
Origin country : Brazil; true_track : 215.54
Origin country : Brazil; true_track : 40.97
Origin country : Brazil; true_track : 349.91
Origin country : Brazil; true_track : 204.8
Origin country : Brazil; true_track : 327.49
Origin country : Brazil; true_track : 201.41
Origin country : Brazil; true_track : 135.36
Origin country : Brazil; true_track : 73.13

Q5 : Recharger les données, les résultats sont-ils les mêmes?¶

In [20]:
states2 = api.get_states()
In [21]:
# Les calculs sont identiques

listt = [k for k in states2.states if k.on_ground == False]
print(f"Combien d'avions volent en ce moment dans le monde? : \n {len(listt)} des avions")

quantite = 0

for s in states2.states:
    if s.on_ground and s.squawk:
        quantite += 1 

print(f"Q2 : Combien sont aux sol mais avec le transpondeur allumé? : \n {quantite} des avions")
Combien d'avions volent en ce moment dans le monde? : 
 6664 des avions
Q2 : Combien sont aux sol mais avec le transpondeur allumé? : 
 122 des avions
In [24]:
states_carre2 = api.get_states(bbox=(42,51,-5,8))
In [25]:
vitesse_som = 0
nombre = 0
for s in states_carre2.states:
    if s.velocity:
        vitesse_som += s.velocity
        nombre += 1
print(f"Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : \n {vitesse_som / nombre} m/s")
Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : 
 175.29663551401865 m/s

**Après avoir rechargé les données, nous pouvons voir que les données ont changé. C'est évident puisque nous utilisons des données en temps réel.



Attention le nombre de requettes étant limité, on ne rejouera pas la cellule précédente. On pourra récuppérer les états correspondants aux avions avec states.states qui est une liste de vecteurs d'états. On retrouve la description dans la documentation.

Represents the state of a vehicle at a particular time. It has the following fields:

  • icao24 - ICAO24 address of the transmitter in hex string representation.
  • callsign - callsign of the vehicle. Can be None if no callsign has been received.
  • origin_country - inferred through the ICAO24 address
  • time_position - seconds since epoch of last position report. Can be None if there was no position report received by OpenSky within 15s before.
  • last_contact - seconds since epoch of last received message from this transponder
  • longitude - in ellipsoidal coordinates (WGS-84) and degrees. Can be None
  • latitude - in ellipsoidal coordinates (WGS-84) and degrees. Can be None
  • geo_altitude - geometric altitude in meters. Can be None
  • on_ground - true if aircraft is on ground (sends ADS-B surface position reports).
  • velocity - over ground in m/s. Can be None if information not present
  • true_track - in decimal degrees (0 is north). Can be None if information not present.
  • vertical_rate - in m/s, incline is positive, decline negative. Can be None if information not present.
  • sensors - serial numbers of sensors which received messages from the vehicle within the validity period of this state vector. Can be None if no filtering for sensor has been requested.
  • baro_altitude - barometric altitude in meters. Can be None
  • squawk - transponder code aka Squawk. Can be None
  • spi - special purpose indicator
  • position_source - origin of this state's position: 0 = ADS-B, 1 = ASTERIX, 2 = MLAT, 3 = FLARM

On va se satisfaire d'extraire les positions, vitesses et orientation pour les positionner sur la carte ainsi que icao24 et calssign pour pouvoir identifier les appareils et les croiser avec d'autres bases de données.

Créer un classe représentant les avions avec les caractéristiques reduitess listées au dessus. Rappel, il est possible de créer plusieurs méthodes d'instanciation avec le décorateur @classmethod. Ne pas oublier la documentation de votre code, il sera relu!
On instanciera cette classe pour tous les `states` obtenu avec opensky_api afin de les sauvegarder (format de votre choix) et surtout de les afficher sur une carte.
In [26]:
class Avion:
    
    """ Il représente les avions en stockant des informations sur leur position, leur vitesse, leur orientation et leur identification. """
    
    def __init__(self, time, icao24, callsign, longitude, latitude, geo_altitude, velocity, true_track, vertical_rate, on_ground):
        self.time = time
        self.icao24 = icao24
        self.callsign = callsign
        self.longitude = longitude
        self.latitude = latitude
        self.geo_altitude = geo_altitude
        self.velocity = velocity
        self.true_track = true_track
        self.vertical_rate = vertical_rate
        self.on_ground = on_ground

    #Classmethod pour creer l'objet avec le objet states directement
        
    @classmethod
    def fromStates(cls, states):
        return cls(time = states.time_position, icao24 = states.icao24, callsign = states.callsign, longitude = states.longitude, latitude = states.latitude, geo_altitude = states.geo_altitude, 
        velocity = states.velocity, true_track = states.true_track, vertical_rate = states.vertical_rate, on_ground = states.on_ground) 
    
    #Classmethod pour creer l'objet avec la liste qu'on peut avoir en utilisant les données fournis en le .csv en
    #le dérnier exercice
    
    @classmethod
    def fromList(cls, list1):
        return cls(time = list1[0], icao24 = list1[1], callsign = list1[7], longitude = list1[3], latitude = list1[2], geo_altitude = list1[9], 
        velocity = list1[4], true_track = list1[5], vertical_rate = list1[6], on_ground = list1[8])          

plane1 = Avion.fromStates(states.states[0])

On écrira une fonction d'affichage qui place les avions sur la carte et représente leur vitesse (taille) et leur direction de manière similaire à ce qui est proposé dans l'exemple.

import matplotlib.pyplot as plt
from matplotlib.markers import MarkerStyle
from matplotlib.colors import Normalize
from matplotlib.textpath import TextPath
from matplotlib.transforms import Affine2D
from avion import Avion
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt

def plot(liste_avion, *args, **kwargs):
    fig = plt.figure(figsize=(15,15))
    tile=cimgt.GoogleTiles("RGB")
    # Create a GeoAxes in the tile's projection.
    ax = fig.add_subplot(1, 1, 1, projection=tile.crs)
    # Limit the extent of the map to a small longitude/latitude range.
    ax.set_extent([-5, 8, 42, 51], crs=ccrs.Geodetic())
    # Add the Stamen data at zoom level 8.
    ax.add_image(tile, 8)

    SUCCESS_SYMBOLS = TextPath((0, 0), "✈") # Définie le marquer avion
    #boucle de plot a écrire

    fig.savefig("carte.jpg")
    plt.show()

On obtiendra un résultat similaire à celui ci! Ne pas hésiter à utiliser d'autres fonds de cartes, icones ou types de représentation (vecteurs...) Vols instantanés 5 Octobre 22

In [27]:
# Création d'une liste avec des instances de la classe avion.

ciel = list()
for s in states_carre.states:
    #ciel.append(Avion(s.time_position, s.icao24, s.callsign, s.longitude, s.latitude, s.geo_altitude, s.velocity, s.true_track, s.vertical_rate, s.on_ground))
    ciel.append(Avion.fromStates(s))
In [28]:
# Importation des librairies à utiliser pour afficher les avions sur la carte.

import matplotlib.pyplot as plt
from matplotlib.markers import MarkerStyle
from matplotlib.colors import Normalize
from matplotlib.textpath import TextPath
from matplotlib.transforms import Affine2D
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt
In [29]:
# Création d'une nouvelle figure de 15 pouces de large et de haut. 
# Le dpi (dots-per-inch) c'est la résolution de la figure
fig = plt.figure(figsize=(15,15),dpi=200)  

# Implémentation de la recherche de tuiles web en utilisant le système de coordonnées Google WTS.
tile = cimgt.GoogleTiles("RGB")

# Create a GeoAxes in the tile's projection.
ax = fig.add_subplot(1, 1, 1, projection=tile.crs)

# Limitation de l'étendue de la carte à une petite plage de longitude/latitude.
ax.set_extent([-5, 8, 42, 51], crs=ccrs.Geodetic())

# Addition de la tuile aux axes au niveau de zoom 8
ax.add_image(tile, 8)

# Création d'un chemin à partir du texte avec TextPath.
# Le symbole unicode U+2708 est utilisé.
SUCCESS_SYMBOLS = TextPath((0, 0), "✈")

# Tous les avions sont ajoutés/dessinés sur la carte.
for af in ciel:
    # Création d'un MarkerStyle pour pouvoir le faire tourner arbitrairement.
    m = MarkerStyle(SUCCESS_SYMBOLS)
    
    # Rotation du marker
    # Ajoutez 90 degrés pour que le symbole X soit orienté vers le nord lorsqu'il est à 0 degré.
    # L'attribut "true_track" est soustrait afin que l'angle soit positif du côté droit, 
    # comme expliqué sur ce site web : https://www.skybrary.aero/articles/heading-track-and-radial
    m._transform = m.get_transform().rotate_deg(90 - af.true_track)
    
    # Définition de la couleur du marker
    if af.velocity > 10:
        color='b'
    else: 
        color="k"
        
    # L'avion est ajouté à la carte en fonction de ses valeurs de latitude et de longitude.
    # La taille de la figure dépend directement de la vitesse actuelle de l'avion.
    ax.plot(af.longitude, af.latitude, 
            marker=m,
            color=color, markersize=50*af.velocity/300, transform=ccrs.Geodetic())

    # La figure est affichée
plt.show()
In [30]:
%load_ext autoreload
%autoreload 2

Données historiques¶

Charger les données fournies avec pandas: https://box.ec-nantes.fr/index.php/s/pR5bfaFdncMZdcy. Il s'agit d'une version allégée, du dump hebdomadaire (450Mo) des données de opensky-network.

  • Que contient le fichier?
  • Quelle plage temporelle?
  • Donner quelques données moyennes : vitesse, position, nombre d'avions par tranche horaire.
  • On en profitera pour mesurer le temps (non négligeable) pour effectuer ces calculs.

Réduire les données pour pouvoir tracer Une fois que l'on a bien les données en main on s'intéresse au déplacement d'un seul appareil (comme pour nos deux influenceurs).

  • Comment ces données s'intègrent-t-elles dans la classe avion que l'on a créée précédement?
  • Proposer un refactoring qui permette d'éviter les doublons lorsque l'on souhaite traver les trajectoires d'un appareil au cours d'une journée
  • Implémenter ces changements.
  • Tracer un vol de votre choix (parametres à déterminer) trajectoire journalière avec une approche similaire à l'exercice précédent.
  • Pour les plus motivés, on pourra traver tous les vols de la journée!

traj

In [31]:
import pandas as pd
import numpy as np
import os
import datetime
import math
In [32]:
os.chdir('/Users/dgalembeck/Documents/Coding/PAPY/#3.2')
df = pd.read_csv('/Users/dgalembeck/Documents/Coding/PAPY/#3.2/flights_1day.csv')

df = df.dropna()
df.sort_values(by = ['time'])
df.head()
Out[32]:
Unnamed: 0 time icao24 lat lon velocity heading vertrate callsign onground geoaltitude
0 0 1656295200 a7e152 40.915553 -87.592496 245.074124 139.085617 0.32512 DAL2356 False 10561.32
1 1 1656295200 a8f975 40.943810 -88.107543 196.871475 187.960714 -5.52704 ENY3658 False 4320.54
2 2 1656295200 7c6d39 -34.748592 139.072666 215.881446 51.190929 11.05408 VOZ1447 False 6949.44
3 3 1656295200 ad6ff2 41.889038 -87.875332 131.028796 136.909152 15.93088 AAL1173 False 1196.34
4 4 1656295200 a537ed 42.287587 -86.857271 228.232894 86.898971 6.17728 RPA4798 False 6697.98
  • Que contient le fichier ?
Le fichier est une .csv avec 10 informations qu'on trouve sur states.states normalement, on peut dire qu'il y a que les informations plus importantes. Les informations sont codifiés avec pour virgules (comma separated values, csv, en anglais).
  • Quelle plage temporelle ?
La plage temporelle est de 59min et 50s, du 27 juin 2022 à 4h jusqu'à 4h59min50s du même jour. Comme on peut voir ci-dessus.
In [33]:
# Comme le time est donné en un entier répresentant le secondes après Linux Epoch time (00:00:00,  1 janvier 1970), 
# il suffit de convertir le plus grand et plus petit entir pour obtenir la plus grande et plus petite date

print('The first flight was on:', datetime.datetime.fromtimestamp(min(df.time)))
print('The last flight was on:', datetime.datetime.fromtimestamp(max(df.time)))
print(len(df.onground))
The first flight was on: 2022-06-27 04:00:00
The last flight was on: 2022-06-27 04:59:50
1659742
On va calculer la vitesse et position moyenne et aussi le nombre d'avions uniques en air chaque 10s, 1min et 10min.
In [34]:
print('Vitesse moyenne de tous les avions pendant tout le période :', np.mean(df.velocity))
print('Position moyenne (latitude moyenne, longitude moyenne) de tous les avions pendant tout le période :', (np.mean(df.lat), np.mean(df.lon)))

# L'idee c'est toujours pareil : d'avoir une sousdf avec les conditions qu'on veut
# Pour ça, on passe une masque comme 'argument' pour le df, la masque a un Boolean pour chaque ligne:
# Si la ligne en question correspont à les conditions desirees (on_ground == False et time approprié)

# Chaque 10 seconds, combien de avions uniques vollaient
seconds = list(set(df.time)) # La liste est déjà de 10 en 10 secondes
seconds.sort()
for k in seconds:
    val = len(set(df[(df.time == k) & (df.onground == False)].icao24)) # on passe la masque, avec set() pour prendre les avions qu'un fois
    print('At {}, there were {} differents planes flying'.format(datetime.datetime.fromtimestamp(k), val))

# Dans l'espace d'un minute, combien de avions uniques vollaient
interval = 60
minutes = list(set([k if (k - list(seconds)[0])%interval == 0 else 1 for k in seconds]))
minutes.sort()
minutes.remove(1)
for k in range(len(minutes) - 1):
    val = len(set(df[(df.time > minutes[k]) & (df.time < minutes[k+1]) & (df.onground == False)].icao24))
    print('Between {} and {}, {} different planes flew'.format(datetime.datetime.fromtimestamp(minutes[k]), datetime.datetime.fromtimestamp(minutes[k+1]),val))


# Dans l'espace d'un heure, combien de avions uniques vollaient
interval = 600
tenminutes = list(set([k if (k - list(seconds)[0])%interval == 0 else 1 for k in seconds]))
tenminutes.sort()
tenminutes.remove(1)
for k in range(len(tenminutes) - 1):
    val = len(set(df[(df.time > tenminutes[k]) & (df.time < tenminutes[k+1]) & (df.onground == False)].icao24))
    print('Between {} and {}, {} different planes flew'.format(datetime.datetime.fromtimestamp(tenminutes[k]), datetime.datetime.fromtimestamp(tenminutes[k+1]),val))
Vitesse moyenne de tous les avions pendant tout le période : 186.07288491185633
Position moyenne (latitude moyenne, longitude moyenne) de tous les avions pendant tout le période : (32.360635418136546, -35.446402330308636)
At 2022-06-27 04:00:00, there were 6 differents planes flying
At 2022-06-27 04:00:10, there were 3870 differents planes flying
At 2022-06-27 04:00:20, there were 3928 differents planes flying
At 2022-06-27 04:00:30, there were 3988 differents planes flying
At 2022-06-27 04:00:40, there were 4034 differents planes flying
At 2022-06-27 04:00:50, there were 4073 differents planes flying
At 2022-06-27 04:01:00, there were 4113 differents planes flying
At 2022-06-27 04:01:10, there were 4147 differents planes flying
At 2022-06-27 04:01:20, there were 4172 differents planes flying
At 2022-06-27 04:01:30, there were 4201 differents planes flying
At 2022-06-27 04:01:40, there were 4225 differents planes flying
At 2022-06-27 04:01:50, there were 4254 differents planes flying
At 2022-06-27 04:02:00, there were 4282 differents planes flying
At 2022-06-27 04:02:10, there were 4304 differents planes flying
At 2022-06-27 04:02:20, there were 4324 differents planes flying
At 2022-06-27 04:02:30, there were 4346 differents planes flying
At 2022-06-27 04:02:40, there were 4378 differents planes flying
At 2022-06-27 04:02:50, there were 4402 differents planes flying
At 2022-06-27 04:03:00, there were 4422 differents planes flying
At 2022-06-27 04:03:10, there were 4444 differents planes flying
At 2022-06-27 04:03:20, there were 4465 differents planes flying
At 2022-06-27 04:03:30, there were 4491 differents planes flying
At 2022-06-27 04:03:40, there were 4506 differents planes flying
At 2022-06-27 04:03:50, there were 4519 differents planes flying
At 2022-06-27 04:04:00, there were 4533 differents planes flying
At 2022-06-27 04:04:10, there were 4557 differents planes flying
At 2022-06-27 04:04:20, there were 4570 differents planes flying
At 2022-06-27 04:04:30, there were 4594 differents planes flying
At 2022-06-27 04:04:40, there were 4612 differents planes flying
At 2022-06-27 04:04:50, there were 4629 differents planes flying
At 2022-06-27 04:05:00, there were 4639 differents planes flying
At 2022-06-27 04:05:10, there were 4653 differents planes flying
At 2022-06-27 04:05:20, there were 4657 differents planes flying
At 2022-06-27 04:05:30, there were 4663 differents planes flying
At 2022-06-27 04:05:40, there were 4671 differents planes flying
At 2022-06-27 04:05:50, there were 4686 differents planes flying
At 2022-06-27 04:06:00, there were 4694 differents planes flying
At 2022-06-27 04:06:10, there were 4705 differents planes flying
At 2022-06-27 04:06:20, there were 4709 differents planes flying
At 2022-06-27 04:06:30, there were 4712 differents planes flying
At 2022-06-27 04:06:40, there were 4717 differents planes flying
At 2022-06-27 04:06:50, there were 4722 differents planes flying
At 2022-06-27 04:07:00, there were 4725 differents planes flying
At 2022-06-27 04:07:10, there were 4716 differents planes flying
At 2022-06-27 04:07:20, there were 4724 differents planes flying
At 2022-06-27 04:07:30, there were 4730 differents planes flying
At 2022-06-27 04:07:40, there were 4729 differents planes flying
At 2022-06-27 04:07:50, there were 4737 differents planes flying
At 2022-06-27 04:08:00, there were 4743 differents planes flying
At 2022-06-27 04:08:10, there were 4734 differents planes flying
At 2022-06-27 04:08:20, there were 4736 differents planes flying
At 2022-06-27 04:08:30, there were 4736 differents planes flying
At 2022-06-27 04:08:40, there were 4741 differents planes flying
At 2022-06-27 04:08:50, there were 4749 differents planes flying
At 2022-06-27 04:09:00, there were 4750 differents planes flying
At 2022-06-27 04:09:10, there were 4758 differents planes flying
At 2022-06-27 04:09:20, there were 4764 differents planes flying
At 2022-06-27 04:09:30, there were 4752 differents planes flying
At 2022-06-27 04:09:40, there were 4752 differents planes flying
At 2022-06-27 04:09:50, there were 4758 differents planes flying
At 2022-06-27 04:10:00, there were 4754 differents planes flying
At 2022-06-27 04:10:10, there were 4757 differents planes flying
At 2022-06-27 04:10:20, there were 4761 differents planes flying
At 2022-06-27 04:10:30, there were 4758 differents planes flying
At 2022-06-27 04:10:40, there were 4761 differents planes flying
At 2022-06-27 04:10:50, there were 4754 differents planes flying
At 2022-06-27 04:11:00, there were 4759 differents planes flying
At 2022-06-27 04:11:10, there were 4753 differents planes flying
At 2022-06-27 04:11:20, there were 4757 differents planes flying
At 2022-06-27 04:11:30, there were 4742 differents planes flying
At 2022-06-27 04:11:40, there were 4735 differents planes flying
At 2022-06-27 04:11:50, there were 4734 differents planes flying
At 2022-06-27 04:12:00, there were 4732 differents planes flying
At 2022-06-27 04:12:10, there were 4729 differents planes flying
At 2022-06-27 04:12:20, there were 4735 differents planes flying
At 2022-06-27 04:12:30, there were 4725 differents planes flying
At 2022-06-27 04:12:40, there were 4728 differents planes flying
At 2022-06-27 04:12:50, there were 4722 differents planes flying
At 2022-06-27 04:13:00, there were 4719 differents planes flying
At 2022-06-27 04:13:10, there were 4727 differents planes flying
At 2022-06-27 04:13:20, there were 4722 differents planes flying
At 2022-06-27 04:13:30, there were 4707 differents planes flying
At 2022-06-27 04:13:40, there were 4697 differents planes flying
At 2022-06-27 04:13:50, there were 4703 differents planes flying
At 2022-06-27 04:14:00, there were 4704 differents planes flying
At 2022-06-27 04:14:10, there were 4710 differents planes flying
At 2022-06-27 04:14:20, there were 4712 differents planes flying
At 2022-06-27 04:14:30, there were 4727 differents planes flying
At 2022-06-27 04:14:40, there were 4722 differents planes flying
At 2022-06-27 04:14:50, there were 4730 differents planes flying
At 2022-06-27 04:15:00, there were 4742 differents planes flying
At 2022-06-27 04:15:10, there were 4743 differents planes flying
At 2022-06-27 04:15:20, there were 4740 differents planes flying
At 2022-06-27 04:15:30, there were 4744 differents planes flying
At 2022-06-27 04:15:40, there were 4756 differents planes flying
At 2022-06-27 04:15:50, there were 4760 differents planes flying
At 2022-06-27 04:16:00, there were 4751 differents planes flying
At 2022-06-27 04:16:10, there were 4740 differents planes flying
At 2022-06-27 04:16:20, there were 4732 differents planes flying
At 2022-06-27 04:16:30, there were 4737 differents planes flying
At 2022-06-27 04:16:40, there were 4731 differents planes flying
At 2022-06-27 04:16:50, there were 4735 differents planes flying
At 2022-06-27 04:17:00, there were 4739 differents planes flying
At 2022-06-27 04:17:10, there were 4728 differents planes flying
At 2022-06-27 04:17:20, there were 4726 differents planes flying
At 2022-06-27 04:17:30, there were 4726 differents planes flying
At 2022-06-27 04:17:40, there were 4723 differents planes flying
At 2022-06-27 04:17:50, there were 4724 differents planes flying
At 2022-06-27 04:18:00, there were 4725 differents planes flying
At 2022-06-27 04:18:10, there were 4712 differents planes flying
At 2022-06-27 04:18:20, there were 4717 differents planes flying
At 2022-06-27 04:18:30, there were 4716 differents planes flying
At 2022-06-27 04:18:40, there were 4714 differents planes flying
At 2022-06-27 04:18:50, there were 4714 differents planes flying
At 2022-06-27 04:19:00, there were 4722 differents planes flying
At 2022-06-27 04:19:10, there were 4725 differents planes flying
At 2022-06-27 04:19:20, there were 4725 differents planes flying
At 2022-06-27 04:19:30, there were 4713 differents planes flying
At 2022-06-27 04:19:40, there were 4713 differents planes flying
At 2022-06-27 04:19:50, there were 4712 differents planes flying
At 2022-06-27 04:20:00, there were 4711 differents planes flying
At 2022-06-27 04:20:10, there were 4703 differents planes flying
At 2022-06-27 04:20:20, there were 4696 differents planes flying
At 2022-06-27 04:20:30, there were 4690 differents planes flying
At 2022-06-27 04:20:40, there were 4699 differents planes flying
At 2022-06-27 04:20:50, there were 4712 differents planes flying
At 2022-06-27 04:21:00, there were 4711 differents planes flying
At 2022-06-27 04:21:10, there were 4708 differents planes flying
At 2022-06-27 04:21:20, there were 4704 differents planes flying
At 2022-06-27 04:21:30, there were 4710 differents planes flying
At 2022-06-27 04:21:40, there were 4709 differents planes flying
At 2022-06-27 04:21:50, there were 4710 differents planes flying
At 2022-06-27 04:22:00, there were 4700 differents planes flying
At 2022-06-27 04:22:10, there were 4704 differents planes flying
At 2022-06-27 04:22:20, there were 4705 differents planes flying
At 2022-06-27 04:22:30, there were 4702 differents planes flying
At 2022-06-27 04:22:40, there were 4705 differents planes flying
At 2022-06-27 04:22:50, there were 4713 differents planes flying
At 2022-06-27 04:23:00, there were 4706 differents planes flying
At 2022-06-27 04:23:10, there were 4711 differents planes flying
At 2022-06-27 04:23:20, there were 4710 differents planes flying
At 2022-06-27 04:23:30, there were 4712 differents planes flying
At 2022-06-27 04:23:40, there were 4713 differents planes flying
At 2022-06-27 04:23:50, there were 4711 differents planes flying
At 2022-06-27 04:24:00, there were 4712 differents planes flying
At 2022-06-27 04:24:10, there were 4709 differents planes flying
At 2022-06-27 04:24:20, there were 4707 differents planes flying
At 2022-06-27 04:24:30, there were 4707 differents planes flying
At 2022-06-27 04:24:40, there were 4706 differents planes flying
At 2022-06-27 04:24:50, there were 4713 differents planes flying
At 2022-06-27 04:25:00, there were 4723 differents planes flying
At 2022-06-27 04:25:10, there were 4720 differents planes flying
At 2022-06-27 04:25:20, there were 4718 differents planes flying
At 2022-06-27 04:25:30, there were 4721 differents planes flying
At 2022-06-27 04:25:40, there were 4711 differents planes flying
At 2022-06-27 04:25:50, there were 4709 differents planes flying
At 2022-06-27 04:26:00, there were 4707 differents planes flying
At 2022-06-27 04:26:10, there were 4703 differents planes flying
At 2022-06-27 04:26:20, there were 4706 differents planes flying
At 2022-06-27 04:26:30, there were 4690 differents planes flying
At 2022-06-27 04:26:40, there were 4674 differents planes flying
At 2022-06-27 04:26:50, there were 4672 differents planes flying
At 2022-06-27 04:27:00, there were 4665 differents planes flying
At 2022-06-27 04:27:10, there were 4665 differents planes flying
At 2022-06-27 04:27:20, there were 4664 differents planes flying
At 2022-06-27 04:27:30, there were 4661 differents planes flying
At 2022-06-27 04:27:40, there were 4672 differents planes flying
At 2022-06-27 04:27:50, there were 4671 differents planes flying
At 2022-06-27 04:28:00, there were 4670 differents planes flying
At 2022-06-27 04:28:10, there were 4670 differents planes flying
At 2022-06-27 04:28:20, there were 4661 differents planes flying
At 2022-06-27 04:28:30, there were 4649 differents planes flying
At 2022-06-27 04:28:40, there were 4655 differents planes flying
At 2022-06-27 04:28:50, there were 4651 differents planes flying
At 2022-06-27 04:29:00, there were 4655 differents planes flying
At 2022-06-27 04:29:10, there were 4647 differents planes flying
At 2022-06-27 04:29:20, there were 4637 differents planes flying
At 2022-06-27 04:29:30, there were 4637 differents planes flying
At 2022-06-27 04:29:40, there were 4643 differents planes flying
At 2022-06-27 04:29:50, there were 4637 differents planes flying
At 2022-06-27 04:30:00, there were 4638 differents planes flying
At 2022-06-27 04:30:10, there were 4640 differents planes flying
At 2022-06-27 04:30:20, there were 4642 differents planes flying
At 2022-06-27 04:30:30, there were 4641 differents planes flying
At 2022-06-27 04:30:40, there were 4633 differents planes flying
At 2022-06-27 04:30:50, there were 4631 differents planes flying
At 2022-06-27 04:31:00, there were 4632 differents planes flying
At 2022-06-27 04:31:10, there were 4628 differents planes flying
At 2022-06-27 04:31:20, there were 4634 differents planes flying
At 2022-06-27 04:31:30, there were 4637 differents planes flying
At 2022-06-27 04:31:40, there were 4640 differents planes flying
At 2022-06-27 04:31:50, there were 4633 differents planes flying
At 2022-06-27 04:32:00, there were 4635 differents planes flying
At 2022-06-27 04:32:10, there were 4624 differents planes flying
At 2022-06-27 04:32:20, there were 4619 differents planes flying
At 2022-06-27 04:32:30, there were 4624 differents planes flying
At 2022-06-27 04:32:40, there were 4622 differents planes flying
At 2022-06-27 04:32:50, there were 4626 differents planes flying
At 2022-06-27 04:33:00, there were 4621 differents planes flying
At 2022-06-27 04:33:10, there were 4628 differents planes flying
At 2022-06-27 04:33:20, there were 4627 differents planes flying
At 2022-06-27 04:33:30, there were 4631 differents planes flying
At 2022-06-27 04:33:40, there were 4634 differents planes flying
At 2022-06-27 04:33:50, there were 4629 differents planes flying
At 2022-06-27 04:34:00, there were 4631 differents planes flying
At 2022-06-27 04:34:10, there were 4634 differents planes flying
At 2022-06-27 04:34:20, there were 4642 differents planes flying
At 2022-06-27 04:34:30, there were 4636 differents planes flying
At 2022-06-27 04:34:40, there were 4633 differents planes flying
At 2022-06-27 04:34:50, there were 4632 differents planes flying
At 2022-06-27 04:35:00, there were 4629 differents planes flying
At 2022-06-27 04:35:10, there were 4622 differents planes flying
At 2022-06-27 04:35:20, there were 4622 differents planes flying
At 2022-06-27 04:35:30, there were 4620 differents planes flying
At 2022-06-27 04:35:40, there were 4618 differents planes flying
At 2022-06-27 04:35:50, there were 4614 differents planes flying
At 2022-06-27 04:36:00, there were 4610 differents planes flying
At 2022-06-27 04:36:10, there were 4611 differents planes flying
At 2022-06-27 04:36:20, there were 4616 differents planes flying
At 2022-06-27 04:36:30, there were 4617 differents planes flying
At 2022-06-27 04:36:40, there were 4624 differents planes flying
At 2022-06-27 04:36:50, there were 4636 differents planes flying
At 2022-06-27 04:37:00, there were 4636 differents planes flying
At 2022-06-27 04:37:10, there were 4638 differents planes flying
At 2022-06-27 04:37:20, there were 4637 differents planes flying
At 2022-06-27 04:37:30, there were 4642 differents planes flying
At 2022-06-27 04:37:40, there were 4641 differents planes flying
At 2022-06-27 04:37:50, there were 4634 differents planes flying
At 2022-06-27 04:38:00, there were 4634 differents planes flying
At 2022-06-27 04:38:10, there were 4634 differents planes flying
At 2022-06-27 04:38:20, there were 4631 differents planes flying
At 2022-06-27 04:38:30, there were 4632 differents planes flying
At 2022-06-27 04:38:40, there were 4630 differents planes flying
At 2022-06-27 04:38:50, there were 4632 differents planes flying
At 2022-06-27 04:39:00, there were 4632 differents planes flying
At 2022-06-27 04:39:10, there were 4632 differents planes flying
At 2022-06-27 04:39:20, there were 4626 differents planes flying
At 2022-06-27 04:39:30, there were 4626 differents planes flying
At 2022-06-27 04:39:40, there were 4612 differents planes flying
At 2022-06-27 04:39:50, there were 4611 differents planes flying
At 2022-06-27 04:40:00, there were 4597 differents planes flying
At 2022-06-27 04:40:10, there were 4606 differents planes flying
At 2022-06-27 04:40:20, there were 4613 differents planes flying
At 2022-06-27 04:40:30, there were 4619 differents planes flying
At 2022-06-27 04:40:40, there were 4615 differents planes flying
At 2022-06-27 04:40:50, there were 4621 differents planes flying
At 2022-06-27 04:41:00, there were 4622 differents planes flying
At 2022-06-27 04:41:10, there were 4618 differents planes flying
At 2022-06-27 04:41:20, there were 4617 differents planes flying
At 2022-06-27 04:41:30, there were 4614 differents planes flying
At 2022-06-27 04:41:40, there were 4610 differents planes flying
At 2022-06-27 04:41:50, there were 4614 differents planes flying
At 2022-06-27 04:42:00, there were 4609 differents planes flying
At 2022-06-27 04:42:10, there were 4621 differents planes flying
At 2022-06-27 04:42:20, there were 4624 differents planes flying
At 2022-06-27 04:42:30, there were 4623 differents planes flying
At 2022-06-27 04:42:40, there were 4624 differents planes flying
At 2022-06-27 04:42:50, there were 4631 differents planes flying
At 2022-06-27 04:43:00, there were 4622 differents planes flying
At 2022-06-27 04:43:10, there were 4629 differents planes flying
At 2022-06-27 04:43:20, there were 4629 differents planes flying
At 2022-06-27 04:43:30, there were 4630 differents planes flying
At 2022-06-27 04:43:40, there were 4624 differents planes flying
At 2022-06-27 04:43:50, there were 4626 differents planes flying
At 2022-06-27 04:44:00, there were 4623 differents planes flying
At 2022-06-27 04:44:10, there were 4622 differents planes flying
At 2022-06-27 04:44:20, there were 4620 differents planes flying
At 2022-06-27 04:44:30, there were 4624 differents planes flying
At 2022-06-27 04:44:40, there were 4619 differents planes flying
At 2022-06-27 04:44:50, there were 4615 differents planes flying
At 2022-06-27 04:45:00, there were 4612 differents planes flying
At 2022-06-27 04:45:10, there were 4611 differents planes flying
At 2022-06-27 04:45:20, there were 4610 differents planes flying
At 2022-06-27 04:45:30, there were 4608 differents planes flying
At 2022-06-27 04:45:40, there were 4613 differents planes flying
At 2022-06-27 04:45:50, there were 4612 differents planes flying
At 2022-06-27 04:46:00, there were 4602 differents planes flying
At 2022-06-27 04:46:10, there were 4607 differents planes flying
At 2022-06-27 04:46:20, there were 4603 differents planes flying
At 2022-06-27 04:46:30, there were 4598 differents planes flying
At 2022-06-27 04:46:40, there were 4597 differents planes flying
At 2022-06-27 04:46:50, there were 4604 differents planes flying
At 2022-06-27 04:47:00, there were 4603 differents planes flying
At 2022-06-27 04:47:10, there were 4596 differents planes flying
At 2022-06-27 04:47:20, there were 4592 differents planes flying
At 2022-06-27 04:47:30, there were 4586 differents planes flying
At 2022-06-27 04:47:40, there were 4583 differents planes flying
At 2022-06-27 04:47:50, there were 4578 differents planes flying
At 2022-06-27 04:48:00, there were 4577 differents planes flying
At 2022-06-27 04:48:10, there were 4574 differents planes flying
At 2022-06-27 04:48:20, there were 4570 differents planes flying
At 2022-06-27 04:48:30, there were 4579 differents planes flying
At 2022-06-27 04:48:40, there were 4578 differents planes flying
At 2022-06-27 04:48:50, there were 4564 differents planes flying
At 2022-06-27 04:49:00, there were 4559 differents planes flying
At 2022-06-27 04:49:10, there were 4564 differents planes flying
At 2022-06-27 04:49:20, there were 4570 differents planes flying
At 2022-06-27 04:49:30, there were 4568 differents planes flying
At 2022-06-27 04:49:40, there were 4568 differents planes flying
At 2022-06-27 04:49:50, there were 4566 differents planes flying
At 2022-06-27 04:50:00, there were 4568 differents planes flying
At 2022-06-27 04:50:10, there were 4572 differents planes flying
At 2022-06-27 04:50:20, there were 4569 differents planes flying
At 2022-06-27 04:50:30, there were 4571 differents planes flying
At 2022-06-27 04:50:40, there were 4570 differents planes flying
At 2022-06-27 04:50:50, there were 4577 differents planes flying
At 2022-06-27 04:51:00, there were 4578 differents planes flying
At 2022-06-27 04:51:10, there were 4592 differents planes flying
At 2022-06-27 04:51:20, there were 4585 differents planes flying
At 2022-06-27 04:51:30, there were 4593 differents planes flying
At 2022-06-27 04:51:40, there were 4587 differents planes flying
At 2022-06-27 04:51:50, there were 4589 differents planes flying
At 2022-06-27 04:52:00, there were 4586 differents planes flying
At 2022-06-27 04:52:10, there were 4580 differents planes flying
At 2022-06-27 04:52:20, there were 4582 differents planes flying
At 2022-06-27 04:52:30, there were 4589 differents planes flying
At 2022-06-27 04:52:40, there were 4588 differents planes flying
At 2022-06-27 04:52:50, there were 4580 differents planes flying
At 2022-06-27 04:53:00, there were 4573 differents planes flying
At 2022-06-27 04:53:10, there were 4573 differents planes flying
At 2022-06-27 04:53:20, there were 4579 differents planes flying
At 2022-06-27 04:53:30, there were 4572 differents planes flying
At 2022-06-27 04:53:40, there were 4570 differents planes flying
At 2022-06-27 04:53:50, there were 4572 differents planes flying
At 2022-06-27 04:54:00, there were 4568 differents planes flying
At 2022-06-27 04:54:10, there were 4567 differents planes flying
At 2022-06-27 04:54:20, there were 4566 differents planes flying
At 2022-06-27 04:54:30, there were 4566 differents planes flying
At 2022-06-27 04:54:40, there were 4563 differents planes flying
At 2022-06-27 04:54:50, there were 4565 differents planes flying
At 2022-06-27 04:55:00, there were 4561 differents planes flying
At 2022-06-27 04:55:10, there were 4551 differents planes flying
At 2022-06-27 04:55:20, there were 4560 differents planes flying
At 2022-06-27 04:55:30, there were 4561 differents planes flying
At 2022-06-27 04:55:40, there were 4559 differents planes flying
At 2022-06-27 04:55:50, there were 4555 differents planes flying
At 2022-06-27 04:56:00, there were 4542 differents planes flying
At 2022-06-27 04:56:10, there were 4552 differents planes flying
At 2022-06-27 04:56:20, there were 4551 differents planes flying
At 2022-06-27 04:56:30, there were 4550 differents planes flying
At 2022-06-27 04:56:40, there were 4538 differents planes flying
At 2022-06-27 04:56:50, there were 4542 differents planes flying
At 2022-06-27 04:57:00, there were 4545 differents planes flying
At 2022-06-27 04:57:10, there were 4533 differents planes flying
At 2022-06-27 04:57:20, there were 4532 differents planes flying
At 2022-06-27 04:57:30, there were 4545 differents planes flying
At 2022-06-27 04:57:40, there were 4540 differents planes flying
At 2022-06-27 04:57:50, there were 4539 differents planes flying
At 2022-06-27 04:58:00, there were 4534 differents planes flying
At 2022-06-27 04:58:10, there were 4530 differents planes flying
At 2022-06-27 04:58:20, there were 4526 differents planes flying
At 2022-06-27 04:58:30, there were 4523 differents planes flying
At 2022-06-27 04:58:40, there were 4523 differents planes flying
At 2022-06-27 04:58:50, there were 4511 differents planes flying
At 2022-06-27 04:59:00, there were 4517 differents planes flying
At 2022-06-27 04:59:10, there were 4525 differents planes flying
At 2022-06-27 04:59:20, there were 4522 differents planes flying
At 2022-06-27 04:59:30, there were 4523 differents planes flying
At 2022-06-27 04:59:40, there were 4526 differents planes flying
At 2022-06-27 04:59:50, there were 4514 differents planes flying
Between 2022-06-27 04:00:00 and 2022-06-27 04:01:00, 4077 different planes flew
Between 2022-06-27 04:01:00 and 2022-06-27 04:02:00, 4262 different planes flew
Between 2022-06-27 04:02:00 and 2022-06-27 04:03:00, 4409 different planes flew
Between 2022-06-27 04:03:00 and 2022-06-27 04:04:00, 4525 different planes flew
Between 2022-06-27 04:04:00 and 2022-06-27 04:05:00, 4632 different planes flew
Between 2022-06-27 04:05:00 and 2022-06-27 04:06:00, 4723 different planes flew
Between 2022-06-27 04:06:00 and 2022-06-27 04:07:00, 4776 different planes flew
Between 2022-06-27 04:07:00 and 2022-06-27 04:08:00, 4790 different planes flew
Between 2022-06-27 04:08:00 and 2022-06-27 04:09:00, 4809 different planes flew
Between 2022-06-27 04:09:00 and 2022-06-27 04:10:00, 4813 different planes flew
Between 2022-06-27 04:10:00 and 2022-06-27 04:11:00, 4815 different planes flew
Between 2022-06-27 04:11:00 and 2022-06-27 04:12:00, 4815 different planes flew
Between 2022-06-27 04:12:00 and 2022-06-27 04:13:00, 4786 different planes flew
Between 2022-06-27 04:13:00 and 2022-06-27 04:14:00, 4782 different planes flew
Between 2022-06-27 04:14:00 and 2022-06-27 04:15:00, 4787 different planes flew
Between 2022-06-27 04:15:00 and 2022-06-27 04:16:00, 4812 different planes flew
Between 2022-06-27 04:16:00 and 2022-06-27 04:17:00, 4795 different planes flew
Between 2022-06-27 04:17:00 and 2022-06-27 04:18:00, 4785 different planes flew
Between 2022-06-27 04:18:00 and 2022-06-27 04:19:00, 4771 different planes flew
Between 2022-06-27 04:19:00 and 2022-06-27 04:20:00, 4777 different planes flew
Between 2022-06-27 04:20:00 and 2022-06-27 04:21:00, 4771 different planes flew
Between 2022-06-27 04:21:00 and 2022-06-27 04:22:00, 4769 different planes flew
Between 2022-06-27 04:22:00 and 2022-06-27 04:23:00, 4774 different planes flew
Between 2022-06-27 04:23:00 and 2022-06-27 04:24:00, 4782 different planes flew
Between 2022-06-27 04:24:00 and 2022-06-27 04:25:00, 4766 different planes flew
Between 2022-06-27 04:25:00 and 2022-06-27 04:26:00, 4788 different planes flew
Between 2022-06-27 04:26:00 and 2022-06-27 04:27:00, 4754 different planes flew
Between 2022-06-27 04:27:00 and 2022-06-27 04:28:00, 4718 different planes flew
Between 2022-06-27 04:28:00 and 2022-06-27 04:29:00, 4721 different planes flew
Between 2022-06-27 04:29:00 and 2022-06-27 04:30:00, 4687 different planes flew
Between 2022-06-27 04:30:00 and 2022-06-27 04:31:00, 4691 different planes flew
Between 2022-06-27 04:31:00 and 2022-06-27 04:32:00, 4687 different planes flew
Between 2022-06-27 04:32:00 and 2022-06-27 04:33:00, 4685 different planes flew
Between 2022-06-27 04:33:00 and 2022-06-27 04:34:00, 4689 different planes flew
Between 2022-06-27 04:34:00 and 2022-06-27 04:35:00, 4705 different planes flew
Between 2022-06-27 04:35:00 and 2022-06-27 04:36:00, 4671 different planes flew
Between 2022-06-27 04:36:00 and 2022-06-27 04:37:00, 4681 different planes flew
Between 2022-06-27 04:37:00 and 2022-06-27 04:38:00, 4695 different planes flew
Between 2022-06-27 04:38:00 and 2022-06-27 04:39:00, 4687 different planes flew
Between 2022-06-27 04:39:00 and 2022-06-27 04:40:00, 4681 different planes flew
Between 2022-06-27 04:40:00 and 2022-06-27 04:41:00, 4672 different planes flew
Between 2022-06-27 04:41:00 and 2022-06-27 04:42:00, 4676 different planes flew
Between 2022-06-27 04:42:00 and 2022-06-27 04:43:00, 4683 different planes flew
Between 2022-06-27 04:43:00 and 2022-06-27 04:44:00, 4696 different planes flew
Between 2022-06-27 04:44:00 and 2022-06-27 04:45:00, 4681 different planes flew
Between 2022-06-27 04:45:00 and 2022-06-27 04:46:00, 4668 different planes flew
Between 2022-06-27 04:46:00 and 2022-06-27 04:47:00, 4666 different planes flew
Between 2022-06-27 04:47:00 and 2022-06-27 04:48:00, 4651 different planes flew
Between 2022-06-27 04:48:00 and 2022-06-27 04:49:00, 4631 different planes flew
Between 2022-06-27 04:49:00 and 2022-06-27 04:50:00, 4631 different planes flew
Between 2022-06-27 04:50:00 and 2022-06-27 04:51:00, 4629 different planes flew
Between 2022-06-27 04:51:00 and 2022-06-27 04:52:00, 4652 different planes flew
Between 2022-06-27 04:52:00 and 2022-06-27 04:53:00, 4642 different planes flew
Between 2022-06-27 04:53:00 and 2022-06-27 04:54:00, 4642 different planes flew
Between 2022-06-27 04:54:00 and 2022-06-27 04:55:00, 4620 different planes flew
Between 2022-06-27 04:55:00 and 2022-06-27 04:56:00, 4613 different planes flew
Between 2022-06-27 04:56:00 and 2022-06-27 04:57:00, 4604 different planes flew
Between 2022-06-27 04:57:00 and 2022-06-27 04:58:00, 4600 different planes flew
Between 2022-06-27 04:58:00 and 2022-06-27 04:59:00, 4586 different planes flew
Between 2022-06-27 04:00:00 and 2022-06-27 04:10:00, 5133 different planes flew
Between 2022-06-27 04:10:00 and 2022-06-27 04:20:00, 5533 different planes flew
Between 2022-06-27 04:20:00 and 2022-06-27 04:30:00, 5472 different planes flew
Between 2022-06-27 04:30:00 and 2022-06-27 04:40:00, 5379 different planes flew
Between 2022-06-27 04:40:00 and 2022-06-27 04:50:00, 5385 different planes flew
Comme on a 3 grandes boucles, on voit que la celulle complète prend en moyenne 3 secondes pour exécuter. Avec un .csv encore plus grand (une plage de temps plus grande) il faudrait chercher d'optimisations dans le code.
Pour tracer la trajectoire journalière, on a utilisé la même logique d'avant, mais avec 4 changements :
  • On choisi qu'un avion avec son 'icao24';

  • On fait une liste d'objets (de la classe Avion) pour chaque ligne que contient information de cet avion, au lieu d'un objet unique par avion;

  • On trace la position de tous les objets, comme ils étaient avions différents, mais on fait, on fait la trajectoire;

  • On change le carré de la carte d'après les coordinées max et min de la latitude et longitude.

In [35]:
set(df.icao24)
Out[35]:
{'aaae52',
 '86e82a',
 'a15879',
 'a1922e',
 'a34729',
 '7c42ce',
 'a57796',
 'ab04f3',
 'a86e6c',
 'ad8835',
 'e49234',
 'a53436',
 '3c6709',
 'a34b6b',
 'a79531',
 '151e10',
 'a44611',
 'a31477',
 'a854d0',
 'aa2bc4',
 'ad7701',
 '7c6d2b',
 'a239e0',
 '151ff8',
 '8881c5',
 '151ed0',
 'a19343',
 'a1463a',
 '4cc279',
 'a05dba',
 '4bcdce',
 '4a08e9',
 'a0b43d',
 'a95107',
 'aaf8ba',
 'a7c63f',
 'aa9e6d',
 'a2228b',
 '02a0ac',
 'a6cff8',
 '86d61c',
 'ab5fc9',
 'a8062b',
 'c827c2',
 'a3c111',
 'a9cd03',
 '841043',
 'a37fa1',
 '440002',
 'a163c2',
 'a31216',
 'a43e60',
 'aba5b6',
 'a5ef0e',
 'ab5b95',
 'a61565',
 'a5adf1',
 '80149d',
 '4baa49',
 'a49ad5',
 '7c4e6b',
 'a3229e',
 '7380c5',
 'a0bf90',
 '4caac1',
 'a82a06',
 '800d58',
 '407b70',
 '846a5b',
 'a5810c',
 'a6d8e7',
 '7c2b84',
 'ae4a28',
 '7c67d7',
 '8a08b8',
 'a638c5',
 'a85ff5',
 'c06a87',
 '3c5431',
 '7c7b63',
 'a14c29',
 '151d6f',
 '7c49f9',
 'a00bdd',
 '4241a1',
 'ac9af0',
 '4891b4',
 'a2bec7',
 '780928',
 '86d68a',
 'ab6eb9',
 '507c50',
 '3c0f75',
 '06a0b3',
 'a258b7',
 '394a15',
 'a3bc09',
 '7cf9de',
 'ab20df',
 'a4870d',
 '7c7800',
 'a3f120',
 '7c44d3',
 'a1cb1d',
 'a84660',
 'a4ce30',
 'aa6ade',
 'a7f40e',
 'a2de17',
 'a86a3d',
 '850e58',
 'a95fef',
 'add376',
 'ac0dd9',
 'ad072a',
 'ad4584',
 '8963b1',
 'c051da',
 '4cad47',
 'a2c1bd',
 '885221',
 '8a01cf',
 'a745db',
 'acf2cf',
 'c023c8',
 'a2e907',
 'a042d5',
 '4d0118',
 'a6a627',
 'acdd18',
 'a441c9',
 'a0a8df',
 'a1c64e',
 '899105',
 'ad44b9',
 '70204a',
 'a4f3d9',
 '7c52fd',
 'a36f90',
 'abe0df',
 'a5d965',
 '50028c',
 '0c20b4',
 '4bb86c',
 '40753d',
 '86eec2',
 'a31a56',
 'c074e5',
 '71bd28',
 'c054a0',
 '7586a8',
 '800c4e',
 '8468ee',
 '4cc2ae',
 'a2afeb',
 'a4e108',
 'ab998b',
 'abf78f',
 'a356f6',
 '841c60',
 'aa1b0e',
 'a2f721',
 '76cdc2',
 'a886bf',
 '710059',
 '3b9bb7',
 '39b44e',
 '06a12f',
 'a6cffc',
 '7805dd',
 'a41cf8',
 'a4c48f',
 '780231',
 '84b860',
 '7c6de0',
 'abafff',
 'a4d5fb',
 'aa2296',
 'a3f04a',
 'a21432',
 'a8f975',
 'a666cd',
 'ab1c47',
 'ae4a13',
 'a24753',
 'ab9f6d',
 'acc774',
 'a40b41',
 'a9ff49',
 '0d08a5',
 'a9046d',
 '8a0824',
 'a6ce36',
 'a22ab9',
 'a2659a',
 'ab7fe6',
 '862d50',
 '4bb1c3',
 'a6e72d',
 'a0956b',
 '841066',
 '88434f',
 'ad53a6',
 'a8df2c',
 '7c7ab9',
 '89653b',
 '151ebd',
 'acfa52',
 'ab72b3',
 '06a11d',
 '800c09',
 'ac7b8a',
 'a43b67',
 'ac8777',
 '8468cc',
 'ab4f5d',
 'a5ec61',
 'a67f2c',
 '8460b0',
 '801492',
 '151ec0',
 '8963db',
 'aa6113',
 'a4e181',
 '899142',
 'aa945d',
 '7c6d36',
 'ab8f0d',
 'a3ed58',
 '842388',
 'aaeae5',
 'a8fc2e',
 'a4c4ec',
 'a976c7',
 'a06386',
 '800c87',
 '70605c',
 'aaee3b',
 '888191',
 'ae1e84',
 'a826f1',
 '86cee7',
 '899123',
 'a7f40f',
 'ab599b',
 'a426da',
 'ac0aac',
 'a08f6b',
 'ad21bc',
 'a33843',
 'a0d655',
 '06a0ff',
 'e494b3',
 'aca309',
 'a9b8aa',
 '7c6d7f',
 'a3a9f8',
 '800d85',
 'aa9ad9',
 'a2af91',
 'a9618a',
 'a39ab4',
 '7c6843',
 'a90af1',
 'a89597',
 'ac7968',
 'a996df',
 'a6ec65',
 '71c364',
 'a557c3',
 'a3bd5f',
 '7c6c96',
 'aa02ab',
 'a0f70c',
 'a6686c',
 'ae0134',
 'a43ea2',
 'e49231',
 '8681ba',
 '7504af',
 'a130bc',
 'a80d40',
 '346317',
 'ae6a15',
 'a7b4ea',
 'a3999e',
 'c8251b',
 'a53b69',
 'a6b253',
 'a69761',
 'a1c534',
 '8a0825',
 'a64b96',
 'ab5975',
 'a16113',
 'a4dba2',
 'a56661',
 'a7d725',
 'a284b5',
 '89408e',
 '4cc50e',
 '7c6b1c',
 'c0807f',
 'a00a0c',
 'ac0818',
 '89648a',
 '151daf',
 'a9b535',
 '781cdf',
 'a59021',
 '71c038',
 'a066a3',
 'a56dcf',
 'ac8d5c',
 '86e430',
 '7c6b09',
 '86d629',
 'abefba',
 '86375c',
 'a3c8cb',
 '48ae03',
 '84c7d2',
 'a19b72',
 'a18d29',
 'acc799',
 '87339a',
 '71bf28',
 '8526e3',
 'a8a083',
 'a54c33',
 'e495b1',
 'a22b2f',
 '76cda2',
 'a8bf73',
 '8a0818',
 '70612e',
 '4007f5',
 'a19404',
 'a44e59',
 'a3965c',
 '06a061',
 'abb271',
 '800d13',
 'a04f40',
 'a842a9',
 'e486c1',
 'a324b0',
 '7c4400',
 'a26ea6',
 'c050a0',
 'a92be6',
 'aa0701',
 'ab9c61',
 'a1515b',
 '4baa46',
 '75854a',
 'a37389',
 'ac15d1',
 'c079d5',
 'a83043',
 'aa7e7b',
 'a4491f',
 '800d94',
 '44aac1',
 '888149',
 'a71efa',
 '7c6bc0',
 'abbd8d',
 '89631c',
 '151fef',
 'a2107b',
 'a90ede',
 '846d0c',
 'a027ca',
 'a0d72b',
 'a393e6',
 'a54c70',
 '885223',
 '4baa10',
 'a144af',
 '48ae23',
 '4d0107',
 '151e2d',
 '40771a',
 'aaed5a',
 'aaee9c',
 '151dea',
 '800cec',
 'a135cb',
 'a5c059',
 '800d14',
 '885308',
 '7c42e1',
 'a7b0c4',
 '0d0cb1',
 'a3d014',
 'a4e8d2',
 'aa4d77',
 '7100b2',
 'ac02b4',
 '801432',
 'ad0ba2',
 'acbe9c',
 'adca15',
 'ab8fee',
 '151d8f',
 '510115',
 '888185',
 '80139d',
 'a3a235',
 '3d0fb2',
 'a19785',
 '4844a0',
 '4d2314',
 'a9d5e5',
 'a8b8b9',
 'a706ea',
 '3a46b1',
 '89610b',
 'e4898a',
 '781ac4',
 'ac74b3',
 '8014c8',
 'a81e15',
 '800af4',
 'a2b12e',
 '71c302',
 'c0797b',
 '7c7f32',
 'aa7e2e',
 'ab9bb6',
 '4bab45',
 'aae810',
 '8013cb',
 'ab40f8',
 'e48ba9',
 '7c11ba',
 '0d0e20',
 '406f72',
 'abbf72',
 '0d0e0e',
 '89913a',
 '7c68b6',
 '846682',
 '49d365',
 'a3c031',
 'a157d9',
 '8411a4',
 '71c256',
 'aab100',
 'acdde3',
 '845dcc',
 'aab1af',
 '505ce6',
 '86ef8e',
 'ab00ce',
 '0d056c',
 '738053',
 '710dc0',
 'ace08c',
 '4b43b0',
 '84b451',
 'aba10d',
 '896504',
 'a261c9',
 'aaaddc',
 '8007b0',
 'a320a6',
 '862db6',
 '4bab4f',
 '3a46b5',
 'ab942f',
 '70afb9',
 '750466',
 'a22ac6',
 'c00ba7',
 'a887e0',
 'a39723',
 'a2e57e',
 'a9bb70',
 'a3c900',
 '846dc8',
 '06a0a6',
 'a365c9',
 '801421',
 '4bb18d',
 'a06270',
 'a376ec',
 'c05da4',
 '710111',
 'a2c467',
 'e8060e',
 '8014db',
 '896526',
 'a442f3',
 'abc478',
 'a785fd',
 '7c7b64',
 '4bc847',
 'aa2a8a',
 'e494f1',
 '34268d',
 '4bb284',
 'a0f2a9',
 'abb0a2',
 '885177',
 'a8c802',
 'a2f41d',
 'a34978',
 'e0b048',
 '80145d',
 'a69974',
 'a3fb6f',
 '40066b',
 '06a094',
 'a3472f',
 '888096',
 '8013e2',
 '0d0a27',
 '84b495',
 'a414e8',
 'a4766a',
 '407cd1',
 '504e57',
 '342450',
 '48412b',
 'a68c54',
 '758087',
 'a27600',
 'a8e45c',
 '4c0178',
 'ac22a7',
 'a223c1',
 'a21c29',
 'a42665',
 'e4988b',
 '7c1b37',
 '8963b5',
 'a339b4',
 'a36b39',
 '4850f5',
 'a4afbe',
 'a78c3e',
 '780217',
 'a09fc4',
 'c80e79',
 '750490',
 'abe79d',
 'a3e18f',
 '7583ee',
 'a6ef36',
 'a21fa1',
 'ac712d',
 '4851af',
 '4acac5',
 'a96f07',
 '800d33',
 '7804f2',
 'ae290a',
 '738101',
 '86d668',
 'aa490a',
 '85111f',
 '4bb86e',
 'a793b1',
 'ab249e',
 '8014b2',
 '8a0849',
 '3c66c1',
 '7c7795',
 '8681b9',
 '0d0d86',
 'a28a5a',
 'c07fb0',
 'a07514',
 'abd010',
 'aa7082',
 'a1c2f1',
 'a3ed69',
 'e48e77',
 'a8f58c',
 'ab358d',
 'a6b1a3',
 'c87f29',
 '46788f',
 'a448f5',
 'c05efd',
 'c0219c',
 'aa9f1c',
 '800cce',
 'a445cd',
 'a1f116',
 'c01040',
 'a92361',
 'a4efdb',
 '3c65d2',
 'abe4db',
 'c05edf',
 'aa244a',
 'c05512',
 '151e8f',
 'a4ae15',
 '8a08b1',
 '7c6ca0',
 '7100c8',
 '600b24',
 '71c324',
 'c055cd',
 'a35d9e',
 '406ade',
 'aa8c10',
 'a8d2a8',
 'ac0b96',
 'a360e3',
 '39cf07',
 'a08512',
 '7c7a4a',
 '89405e',
 '401079',
 'a8ef81',
 'acd0c2',
 'a5fcef',
 'a13e1c',
 'a59f53',
 '7c1b2b',
 '151e19',
 'c07b42',
 '06a0a7',
 'a02a44',
 'a88467',
 '888147',
 'a894c0',
 '8004d6',
 'a10bbc',
 'abadd6',
 'ad3870',
 'a448d5',
 'a2682a',
 '7c6dd7',
 'acb4c1',
 '8964e2',
 '800d43',
 '0a001a',
 'a27a26',
 'a2b12d',
 '7c7bce',
 'a24a0a',
 '4952b0',
 'ab5d52',
 'a63e46',
 'acc23f',
 'ac8111',
 'a37db9',
 'a9cdd2',
 '7c79d6',
 'ac2952',
 'a4ce71',
 'a85d50',
 'a33d68',
 '0d0760',
 '896411',
 'a178ae',
 'aad5ca',
 '86d295',
 '780be3',
 'a851e2',
 '7c6a8c',
 '896191',
 'a8dfc7',
 'a48fbe',
 'ac2dea',
 '76b865',
 '0c20a8',
 'a4c0a8',
 '400773',
 'a4cbfd',
 'a41447',
 'c031c9',
 'a1388c',
 '7c6282',
 'ad7b02',
 '3c6703',
 '840659',
 'a46ce1',
 'aa7a61',
 'aa955c',
 'a3ad89',
 'c030f7',
 '7c7c76',
 'ab39f0',
 'a3ec89',
 'a223f0',
 '46b828',
 '86796c',
 '4d0116',
 'a9dea0',
 'a0958d',
 'ac5d61',
 'a641bf',
 'a2fe28',
 '7c77fa',
 '151fb7',
 'ad0c51',
 'aac540',
 'aa9723',
 'a3a5ec',
 '4bd183',
 '7586d7',
 '06a0df',
 'a0345f',
 '151dc9',
 'acea6a',
 '71bf90',
 'a0f869',
 'a448f6',
 '800407',
 'abd1e3',
 'c01a61',
 'ab477d',
 'aaa9b6',
 'a02f50',
 'a3b110',
 '7c02e1',
 'a87b97',
 'a6893c',
 '88819a',
 'a42b45',
 'c0502e',
 'a22642',
 'a34201',
 'a74871',
 '70c0c6',
 'a4350c',
 'a20d01',
 '0d0b7c',
 'a44a6d',
 '4bcde8',
 '76cd04',
 '8014df',
 '4ca9c3',
 'c80cdf',
 'a857c2',
 '800cb6',
 '4b8e0c',
 'adb437',
 'c810af',
 '152027',
 'a7df59',
 'adb7ee',
 'c0523f',
 '7502de',
 'a9c98f',
 '0c6060',
 '800da2',
 'c05060',
 '500194',
 'a2d6a2',
 '800c9b',
 '89630d',
 '7c39f9',
 'c81c58',
 '440c8d',
 'ac3fec',
 'ad2df0',
 'c035f7',
 'a880b0',
 'c82986',
 '0c20dc',
 'ad0083',
 '0d07fa',
 'a2c93f',
 'c821ee',
 '4baad3',
 '758691',
 'a5823e',
 'a93711',
 'ab483c',
 'abfd39',
 'abd5bb',
 '4ca9df',
 '75049d',
 '151df8',
 'a9c52e',
 'a35283',
 '86d94a',
 'a0ddfb',
 '4bcdd5',
 '86d310',
 'ab5b66',
 'a1c5e0',
 '76b44b',
 'a68ddb',
 'aa7409',
 '861c10',
 '7c6729',
 'a511f6',
 'a252a7',
 'a1d93b',
 'a1417f',
 'a687ac',
 'a4972c',
 '3c6701',
 'c8195c',
 'ab38aa',
 'a9be80',
 '86260b',
 'ab184d',
 'a64d03',
 'a2b10f',
 'a5d643',
 'aaf83c',
 'a32867',
 'a97328',
 '86e28f',
 '75044a',
 'a4fbb4',
 '0d0d36',
 'acddbe',
 '3444ce',
 '7812a1',
 'abe77a',
 '0ac9ef',
 'aa030b',
 '800c92',
 'a3524f',
 '48ae25',
 '71c041',
 'adea26',
 'abe2a3',
 '71c056',
 '0d0bbe',
 'aaad49',
 'ac18fe',
 'ad493b',
 'ab03a4',
 'a8d46a',
 '75044b',
 '406c80',
 'a536d5',
 '78110b',
 'a411df',
 'a55017',
 '06002f',
 'a271fd',
 '738443',
 'a3183d',
 '7c4510',
 'a7e9e4',
 '800ced',
 '70c0fd',
 'a31a54',
 'ad4870',
 '89405c',
 'a657ad',
 '801407',
 'acc5fb',
 'a6f482',
 '448465',
 'c060b3',
 '3c64f5',
 'a89872',
 'ae4a79',
 'a2a686',
 '86eee4',
 'a0835d',
 'a174f7',
 'adde95',
 'ae1478',
 'aa7952',
 '06a19f',
 '4841c5',
 '872fa0',
 '4ba9c8',
 'abd932',
 'ac3dc8',
 '76cc6f',
 'c012bd',
 '800db0',
 'a682ef',
 'a7912a',
 '7803b0',
 '4d22ec',
 '48455e',
 '7100c1',
 'a1dc31',
 '896307',
 'a33325',
 'e07246',
 '68322c',
 'a02792',
 'a8d360',
 '896175',
 'c0816e',
 'ad8895',
 'a28812',
 'a47d11',
 '88809d',
 '440144',
 'ab9387',
 '155bca',
 '750141',
 'a3a0cc',
 '861f1a',
 '76cd0c',
 'a4c757',
 'a254f8',
 '8410b9',
 '4077c6',
 '885968',
 'aa777e',
 '846bfa',
 'a1e5f8',
 'a0d9dd',
 'a5ac1d',
 'a4b7d3',
 'abec6c',
 '4baa50',
 'a88cbf',
 'a5d1f7',
 '4bb161',
 'a9c537',
 'a28bc9',
 'ab4ba6',
 '896453',
 '7c42d6',
 '155c0d',
 'abff87',
 'a87f50',
 '7c3868',
 'a03b67',
 '7c7a46',
 'aa1f65',
 '140b40',
 '7380c0',
 'a92fa3',
 '7c8066',
 '71c319',
 'a83988',
 '4bcde4',
 'a4b41c',
 '8681aa',
 '84640c',
 '8674ac',
 'a7e509',
 'a05f92',
 'add66d',
 '781b7b',
 '80141c',
 'ada4fb',
 'a145b7',
 'c81c28',
 '71c334',
 '3e4053',
 'aa369a',
 'e80242',
 '4bb324',
 'a4f752',
 '151eca',
 'a8f3c5',
 '7c4929',
 'a2f584',
 'a2e93c',
 'c0360e',
 'abd9b6',
 'a070d7',
 'ac048d',
 'a93209',
 '7c2bea',
 'a56323',
 'a11afd',
 '7380cb',
 'ad27f3',
 'a443e8',
 'c06b76',
 'ad8301',
 'a2b8db',
 'a2175c',
 'a9e4bc',
 '71c008',
 '45ce55',
 'a4f5a0',
 'a08663',
 'a1d811',
 '4841a6',
 '4952a8',
 '344503',
 'c82458',
 'aaa4be',
 '71bd53',
 '7800e8',
 '89408c',
 'a34bdc',
 'aa9b89',
 'aae911',
 '850e9c',
 '71bf44',
 'c01d1f',
 'ae6499',
 'c06cc3',
 'adb29f',
 ...}
In [36]:
df_avion = df[df.icao24 == '86375c']
lats = df_avion['lat'].to_list()
longs = df_avion['lon'].to_list()
max(lats), min(lats), max(longs), min(longs)
Out[36]:
(40.93336486816406, 35.259796142578125, 140.679931640625, 136.89221970578458)
In [37]:
nv_ciel = []
for k in range(len(df_avion)):
    nv_ciel.append(Avion.fromList(df_avion.iloc[k].to_list()[1:]))

# Création d'une nouvelle figure de 15 pouces de large et de haut. 
# Le dpi (dots-per-inch) c'est la résolution de la figure
fig = plt.figure(figsize=(15,15),dpi=200)  

# Implémentation de la recherche de tuiles web en utilisant le système de coordonnées Google WTS.
tile = cimgt.GoogleTiles("RGB")

# Create a GeoAxes in the tile's projection.
ax = fig.add_subplot(1, 1, 1, projection=tile.crs)

# Limitation de l'étendue de la carte à une petite plage de longitude/latitude.
ax.set_extent([min(longs)-2, max(longs)+2, min(lats)-2, max(lats)+2], crs=ccrs.Geodetic())

# Addition de la tuile aux axes au niveau de zoom 8
ax.add_image(tile, 8)

# Création d'un chemin à partir du texte avec TextPath.
# Le symbole unicode U+2708 est utilisé.
SUCCESS_SYMBOLS = TextPath((0, 0), "✈")

# Tous les avions sont ajoutés/dessinés sur la carte.
for af in nv_ciel:
    # Création d'un MarkerStyle pour pouvoir le faire tourner arbitrairement.
    m = MarkerStyle(SUCCESS_SYMBOLS)
    #af.longitude = longs
    #af.latitude = lats
    # Rotation du marker
    # Ajoutez 90 degrés pour que le symbole X soit orienté vers le nord lorsqu'il est à 0 degré.
    # L'attribut "true_track" est soustrait afin que l'angle soit positif du côté droit, 
    # comme expliqué sur ce site web : https://www.skybrary.aero/articles/heading-track-and-radial
    m._transform = m.get_transform().rotate_deg(90 - af.true_track)
    
    # Définition de la couleur du marker
    if af.velocity > 10:
        color='r'
    else: 
        color="r"
        
    # L'avion est ajouté à la carte en fonction de ses valeurs de latitude et de longitude.
    # La taille de la figure dépend directement de la vitesse actuelle de l'avion.
    ax.plot(af.longitude, af.latitude, 
            marker=m,
            color=color, markersize=10*af.velocity/300, transform=ccrs.Geodetic())

    # La figure est affichée
plt.show()